#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=5005;
int n;
int a[N],l[N],r[N];
int dp[N];
bool vis[N];
int main(void){
    scanf("%d",&n);
    //顺便预处理出每个数的最左和最右位置
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(!l[a[i]]){
            l[a[i]]=i;
        }
        r[a[i]]=i;
    }
    //dp[i]表示到i位置的最大异或和
    for(int i=1;i<=n;i++){
        memset(vis,false,sizeof(vis));
        //先默认这一个数不取
        dp[i]=dp[i-1];
        int ans=0;
        int Min=i;
        //变量i前面的数
        for(int j=i;j>=1;j--){
            int t=a[j];
            //避免重复异或
            if(!vis[t]){
                //如果前面有一个数的最右位置大于i，那么i这个线段就拓展到这里位置，如果要包含j这个数就必须包含后面的最右
                if(r[t]>i){
                    break;
                }
                //找到这个线段能延续到的最左端
                Min=min(Min,l[t]);
                //将这个数异或并标记
                ans=ans^t;
                vis[t]=1;
            }
            printf("%d %d %d\n",i,j,Min);
            //此时尝试选取的线段就是[j,i]
            //状态转移，j<=Min说明这个线段包含了j这个数的最左
            if(j<=Min){
                dp[i]=max(dp[i],dp[j-1]+ans);
            }
        }
    }
    printf("%d\n",dp[n]);
    return 0;
}